package com.colorlight.cloud.mqtt.base.entity;

import lombok.Getter;

/**
 * @author Demon
 * 在 MQTT（Message Queuing Telemetry Transport）协议中，QoS（Quality of Service）用于定义消息的交付保证级别。
 * QoS 有三个级别：0、1 和 2。
 * QOS 级别
 */
@Getter
public enum QosEnum {
	/**
	 * 下发消息（Client-to-Server）
	 * QoS 0：At most once（至多一次）
	 * <p>
	 * 发布消息，消息将至多传递一次，可能会丢失。此级别没有消息确认。
	 * 发送者将消息发送到服务器，然后将其视为已成功发送。服务器无需确认消息的接收。
	 * QoS 1：At least once（至少一次）
	 * <p>
	 * 发布消息，消息将至少传递一次，但可能会重复。
	 * 发送者发送消息，如果服务器未收到确认，它将重新发送消息，直到接收到确认为止。
	 * QoS 2：Exactly once（仅一次）
	 * <p>
	 * 发布消息，消息将确保只传递一次。
	 * 发送者和服务器进行握手以确保消息仅传递一次。确保消息的精确一次传递，这通常需要两次消息交换。
	 * 上报消息（Server-to-Client）
	 * 对于上报消息，QoS 的含义相对简单，因为在 Server-to-Client 的情况下，通常只使用 QoS 0 或 QoS 1。
	 * <p>
	 * QoS 0：At most once（至多一次）
	 * <p>
	 * 发送者将消息发送到客户端，但不需要客户端确认。消息最多传递一次，可能会丢失。
	 * QoS 1：At least once（至少一次）
	 * <p>
	 * 发送者将消息发送到客户端，需要客户端确认。如果客户端未收到确认，它将重新请求消息，直到确认为止。
	 */
	QOS_O(0, "At most once"),
	QOS_1(1, "At least once"),
	QOS_2(2, "Exactly once");
	private final Integer value;
	private final String description;
	
	QosEnum(int value, String description) {
		this.value = value;
		this.description = description;
	}
	
	public static QosEnum getQos(Integer vale) {
		for (QosEnum qosEnum : QosEnum.values()) {
			if (qosEnum.value.equals(vale)) {
				return qosEnum;
			}
		}
		throw new IllegalArgumentException("无效QOS设置");
	}
}
